private subroutine get_unit(unit, string, maxlen, iostat)
Read from the specified unit into a varying string
Arguments
Type |
Intent | Optional | Attributes |
|
Name |
|
integer,
|
intent(in) |
|
|
:: |
unit |
|
type(varying_string),
|
intent(out) |
|
|
:: |
string |
|
integer,
|
intent(in), |
optional |
|
:: |
maxlen |
|
integer,
|
intent(out), |
optional |
|
:: |
iostat |
|
Variables
Type |
Visibility | Attributes |
|
Name |
| Initial | |
character(len=GET_BUFFER_LEN),
|
private |
|
:: |
buffer |
|
|
|
integer,
|
private |
|
:: |
n_chars_read |
|
|
|
integer,
|
private |
|
:: |
n_chars_remain |
|
|
|
Source Code
subroutine get_unit (unit, string, maxlen, iostat)
integer, intent(in) :: unit
type(varying_string), intent(out) :: string
integer, intent(in), optional :: maxlen
integer, intent(out), optional :: iostat
integer :: n_chars_remain
integer :: n_chars_read
character(LEN=GET_BUFFER_LEN) :: buffer
string = ''
if(PRESENT(maxlen)) then
n_chars_remain = maxlen
else
n_chars_remain = HUGE(1)
endif
read_loop : do
if(n_chars_remain <= 0) return
n_chars_read = MIN(n_chars_remain, GET_BUFFER_LEN)
if(PRESENT(iostat)) then
read(unit, FMT='(A)', ADVANCE='NO', IOSTAT=iostat, SIZE=n_chars_read) buffer(:n_chars_read)
if(iostat < 0) exit read_loop
if(iostat > 0) return
else
read(unit, FMT='(A)', ADVANCE='NO', EOR=999, SIZE=n_chars_read) buffer(:n_chars_read)
endif
string = string//buffer(:n_chars_read)
n_chars_remain = n_chars_remain - n_chars_read
end do read_loop
999 continue
string = string//buffer(:n_chars_read)
! Finish (end-of-record)
return
end subroutine get_unit